package spring_learn.a12;


import java.lang.reflect.Method;

/*
对jdk的动态代理实现进行模拟，理解jdk代理的实现原理


代理一点都不难, 无非就是利用了多态、反射的知识
                1. 方法重写可以增强逻辑, 只不过这【增强逻辑】千变万化, 不能写死在代理内部
                2. 通过接口回调将【增强逻辑】置于代理类之外
                3. 配合接口方法反射(也是多态), 就可以再联动调用目标方法
 */
public class A12 {

    interface foo{
        void foo1();
        void foo2();
    }

    static class Target implements foo{

        @Override
        public void foo1() {
            System.out.println("foo1");
        }

        @Override
        public void foo2() {
            System.out.println("foo2");
        }
    }

    public static void main(String[] args) {
        Target target=new Target();
        foo foo_proxy = (foo)new Proxy$Target((proxy, method, args1) -> {
            System.out.println("before");
            Object invoke = method.invoke(target, args1);
            System.out.println("after");
            return invoke;
        });
        foo_proxy.foo1();
        foo_proxy.foo2();
    }
}
